<?php
/**
 * Project:
 * drugCMS CMS
 *
 * Description:
 * Generate metatags for current article if they are not set in article properties
 *
 * @package    drugCMS Core
 * @subpackage Chains
 * @version    1.0
 * @author     Ortwin Pinke
 * 
 * based on CONTENIDO 4.8.15 [2011-07-31]
 * @author     Andreas Lindner, Unknown
 * @copyright  four for business AG <www.4fb.de>
 * @license    http://www.contenido.org/license/LIZENZ.txt
 * @link       http://www.4fb.de
 * @link       http://www.contenido.org
 *
 * $Id: include.chain.content.createmetatags.php 3 2014-09-24 16:38:44Z R.Mansveld@Spider-IT.de $:
 */

/**
 * No direct call
 */
if(!defined('CON_FRAMEWORK')) {
    die('Illegal call');
}

// Compatibility for php < 5.3 using closures or not, @todo remove if we only support PHP >= 5.3
if(version_compare(PHP_VERSION, "5.3", "<")) {
    cInclude("plugins", "chains/createmetatags/includes/keyword_density_php52.php");
} else {
    cInclude("plugins", "chains/createmetatags/includes/keyword_density.php");
}
cInclude("plugins", "chains/createmetatags/classes/class.metatag.creator.html5.php");

function cecCreateMetatags($metatags) {

    global $cfg, $lang, $idart, $client, $cfgClient, $idcat, $idartlang;
    
    $bIsHTML5   = ((getEffectiveSetting('generator', 'html5', 'false') == 'false') ? false : true);
    
    if($bIsHTML5) {        
        $aConfig = array(
            'cachetime' => 3600,
            'cachedir'  => $cfgClient[$client]['path']['frontend'] . "cache/"            
        );
        
        $oHtml5MetaCreator = new MetaTagCreatorHtml5($metatags, $aConfig);        
        return $oHtml5MetaCreator->generateMetaTags();
    }   

    //Basic settings
    $cachetime = 3600; // measured in seconds
    $cachedir = $cfgClient[$client]['path']['frontend'] . "cache/";

    if (!is_array($metatags)) {
        $metatags = array();
    }

    $hash = 'metatag_'.md5($idart.'/'.$lang);
    $cachefilename = $cachedir.$hash.'.tmp';

    #Check if rebuilding of metatags is necessary
    $reload = true;

    $fileexists = false;

    if (file_exists($cachefilename)) {
        $fileexists = true;

        $diff =  mktime() - filemtime($cachefilename);

        if ($diff > $cachetime) {
            $reload = true;
        } else {
            $reload = false;
        }
    }

    if ($reload) {
        //(Re)build metatags
        $db = new DB_Contenido();

        #Get encoding
        $sql = "SELECT * FROM ".$cfg['tab']['lang']." WHERE idlang=".(int)$lang;
        $db->query($sql);
        if ($db->next_record()) {
            $sEncoding = strtoupper($db->f('encoding'));
        } else {
            $sEncoding = "ISO-8859-1";
        }

        #Get idcat of homepage
        $sql = "SELECT a.idcat
            FROM
                ".$cfg['tab']['cat_tree']." AS a,
                ".$cfg['tab']['cat_lang']." AS b
            WHERE
                (a.idcat = b.idcat) AND
                (b.visible = 1) AND
                (b.idlang = ".Contenido_Security::toInteger($lang).")
            ORDER BY a.idtree LIMIT 1";

        $db->query($sql);

        if ($db->next_record()) {
            $idcat_homepage = $db->f('idcat');
        }

        $availableTags = conGetAvailableMetaTagTypes();

        #Get first headline and first text for current article
        $oArt = new Article ($idart, $client, $lang);

        #Set idartlang, if not set
        if ($idartlang == '') {
            $idartlang = $oArt->getIdArtLang();
        }

        $arrHead1 = $oArt->getContent("htmlhead");
        $arrHead2 = $oArt->getContent("head");

        if (!is_array($arrHead1)) {
            $arrHead1 = array();
        }

        if (!is_array($arrHead2)) {
            $arrHead2 = array();
        }

        $arrHeadlines = array_merge($arrHead1, $arrHead2);

        foreach ($arrHeadlines as $key => $value) {
            if ($value != '') {
                $sHeadline = $value;
                break;
            }
        }

        $sHeadline = strip_tags($sHeadline);
        $sHeadline = substr(str_replace(chr(13).chr(10),' ',$sHeadline),0,100);

        $arrText1 = $oArt->getContent("html");
        $arrText2 = $oArt->getContent("text");

        if (!is_array($arrText1)) {
            $arrText1 = array();
        }

        if (!is_array($arrText2)) {
            $arrText2 = array();
        }

        $arrText = array_merge($arrText1, $arrText2);

        foreach ($arrText as $key => $value) {
            if ($value != '') {
                $sText = $value;
                break;
            }
        }

        $sText = strip_tags(urldecode($sText));
        $sText = keywordDensity ('', $sText);

        //Get metatags for homeapge
        $arrHomepageMetaTags = array();

        $sql = "SELECT startidartlang FROM ".$cfg["tab"]["cat_lang"]." WHERE (idcat=".Contenido_Security::toInteger($idcat_homepage).") AND(idlang=".Contenido_Security::toInteger($lang).")";
        $db->query($sql);

        if($db->next_record()){
            $iIdArtLangHomepage = $db->f('startidartlang');

            #get idart of homepage
            $sql = "SELECT idart FROM ".$cfg["tab"]["art_lang"]." WHERE idartlang =".Contenido_Security::toInteger($iIdArtLangHomepage);

            $db->query($sql);

            if ($db->next_record()) {
                $iIdArtHomepage = $db->f('idart');
            }

            $t1 = $cfg["tab"]["meta_tag"];
            $t2 = $cfg["tab"]["meta_type"];

            $sql = "SELECT ".$t1.".metavalue,".$t2.".metatype FROM ".$t1.
                " INNER JOIN ".$t2." ON ".$t1.".idmetatype = ".$t2.".idmetatype WHERE ".
                $t1.".idartlang =".$iIdArtLangHomepage.
                " ORDER BY ".$t2.".metatype";

            $db->query($sql);

            while ($db->next_record()) {
                $arrHomepageMetaTags[$db->f("metatype")] = $db->f("metavalue");
            }

            $oArt = new Article ($iIdArtHomepage, $client, $lang);

            $arrHomepageMetaTags['pagetitle'] = $oArt->getField('title');
        }

        //Cycle through all metatags
        foreach ($availableTags as $key => $value) {
            $metavalue = conGetMetaValue($idartlang, $key);

            if (strlen($metavalue) == 0){
                //Add values for metatags that don't have a value in the current article
                switch(strtolower($value["name"])){
                    case 'author':
                        //Build author metatag from name of last modifier
                        $oArt = new Article ($idart, $client, $lang);
                        $lastmodifier = $oArt->getField("modifiedby");
                        $oUser = new User();
                        $oUser->loadUserByUserID(md5($lastmodifier));
                        $lastmodifier_real = $oUser->getRealname(md5($lastmodifier));

                        $iCheck = CheckIfMetaTagExists($metatags, 'author');
                        $metatags[$iCheck]['name'] = 'author';
                        $metatags[$iCheck]['content'] = $lastmodifier_real;

                        break;
                    case 'date':
                        //Build date metatag from date of last modification
                        $oArt = new Article ($idart, $client, $lang);
                        $lastmodified = $oArt->getField("lastmodified");

                        $iCheck = CheckIfMetaTagExists($metatags, 'date');
                        $metatags[$iCheck]['name'] = 'date';
                        $metatags[$iCheck]['content'] = $lastmodified;

                        break;
                    case 'description':
                        //Build description metatag from first headline on page
                        $iCheck = CheckIfMetaTagExists($metatags, 'description');
                        $metatags[$iCheck]['name'] = 'description';
                        $metatags[$iCheck]['content'] = htmlentities(html_entity_decode($sHeadline, ENT_COMPAT, $sEncoding), ENT_COMPAT, $sEncoding);

                        break;
                    case 'keywords':
                        $iCheck = CheckIfMetaTagExists($metatags, 'keywords');
                        $metatags[$iCheck]['name'] = 'keywords';
                        $metatags[$iCheck]['content'] = htmlentities(html_entity_decode($sText, ENT_COMPAT, $sEncoding), ENT_COMPAT, $sEncoding);

                        break;
                    case 'revisit-after':
                    case 'robots':
                    case 'expires':
                        //Build these 3 metatags from entries in homepage
                        $sCurrentTag = strtolower($value["name"]);
                        $iCheck = CheckIfMetaTagExists($metatags, $sCurrentTag);
                        $metatags[$iCheck]['name'] = $sCurrentTag;
                        $metatags[$iCheck]['content'] = $arrHomepageMetaTags[$sCurrentTag];
                        break;
                }
            }
        }

        // save metatags in cache file
        file_put_contents($cachefilename, serialize($metatags));

    } else {
        #Get metatags from file system cache
        $metatags = unserialize(file_get_contents($cachefilename));
    }

    return $metatags;
}


/**
 * Checks if the metatag allready exists inside the metatag list.
 *
 * @param   array|mixed  $arrMetatags       List of metatags or not a list
 * @param   string       $sCheckForMetaTag  The metatag to check
 * @return  int                             Position of metatag inside the metatag list or the next
 *                                          available position
 */
function CheckIfMetaTagExists($arrMetatags, $sCheckForMetaTag) {
    if (!is_array($arrMetatags) || count($arrMetatags) == 0) {
        // metatag list ist not set or empty, return initial position
        return 0;
    }

    // loop thru existing metatags and check against the listitem name
    foreach ($arrMetatags as $pos => $item) {
        if ($item['name'] == $sCheckForMetaTag) {
            // metatag found -> return the position
            return $pos;
        }
    }

    // metatag doesn't exists, return next position
    return count($arrMetatags);
}
?>